package algorithm_primary.studyClass.新手课程.双指针;

/**
 * @author 衡孟浩
 * @date 2023/5/28 14:01
 */
public class DoubleMain {

    public static void main(String[] args) {
        DoubleNode initNode = createInitNode();
//        while (initNode != null) {
//            System.out.print(initNode.value + " ");
//            initNode = initNode.next;
//        }
        DoubleNode reverseNode = reverseNode(initNode);
        while (reverseNode != null) {
            System.out.print(reverseNode.value + " ");
            reverseNode = reverseNode.next;
        }
    }

    /**
     *         反转前
     *         next-> node2 ->node3 -> null
     *         node1
     * null <- last <- node2 <- node3
     *
     *
     *         反转后
     * null <- next <- node2 <- node3
     *         node1
     *         last->node2 ->node3 -> null
     *
     *
     *
     * 第一次循环
     * head = node1    pre = null   next = null
     * 循环后
     *
     * @param head
     * @return
     */
    private static DoubleNode reverseNode(DoubleNode head) {

        DoubleNode pre = null,next = null;
        while (head != null){
            // 先记下来原本的 节点下一个节点是谁
            next = head.next;
            // 将当前节点原本的下一个节点改为上一个节点  比如  node1 - > node2 -> node3   这个node2的下一个接待你原本是 node3 现在node成为了上一个节点
            head.next = pre;
            // node节点的下一个节点现在成为了上一个节点
            head.last = next;
            // 纪录留作下个head操作
            pre = head;
            head = next;
        }
        return pre;
    }


    private static DoubleNode createInitNode() {
        DoubleNode doubleNode = new DoubleNode(1);
        doubleNode.next = new DoubleNode(2);
        doubleNode.next.last = doubleNode;
        doubleNode.next.next = new DoubleNode(3);
        doubleNode.next.next.last = doubleNode.next.next;
        return doubleNode;
    }
}
